static void
show_popup (GdkSurface *surface)
{
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
gdk_broadway_surface_show (surface, FALSE);
gdk_surface_invalidate_rect (surface, NULL);
}
was_mapped = GDK_SURFACE_IS_MAPPED (surface);
if (!was_mapped)
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
gdk_broadway_surface_show (surface, FALSE);
static void gdk_surface_set_frame_clock (GdkSurface *surface,
GdkFrameClock *clock);
+static void gdk_surface_queue_set_is_mapped (GdkSurface *surface,
+ gboolean is_mapped);
+
static guint signals[LAST_SIGNAL] = { 0 };
static GParamSpec *properties[LAST_PROP] = { NULL, };
{
/* 0-initialization is good for all other fields. */
- surface->state = GDK_TOPLEVEL_STATE_WITHDRAWN;
+ surface->state = 0;
surface->fullscreen_mode = GDK_FULLSCREEN_ON_CURRENT_MONITOR;
surface->width = 1;
surface->height = 1;
_gdk_surface_clear_update_area (surface);
- surface->state |= GDK_TOPLEVEL_STATE_WITHDRAWN;
+ g_clear_handle_id (&surface->set_is_mapped_source_id, g_source_remove);
+ surface->is_mapped = FALSE;
+ surface->pending_is_mapped = FALSE;
+
surface->destroyed = TRUE;
surface_remove_from_pointer_info (surface, surface->display);
was_mapped = GDK_SURFACE_IS_MAPPED (surface);
- if (GDK_SURFACE_IS_MAPPED (surface))
- {
- gdk_synthesize_surface_state (surface,
- surface->state & ~GDK_TOPLEVEL_STATE_WITHDRAWN,
- GDK_TOPLEVEL_STATE_WITHDRAWN);
- surface->pending_unset_flags = 0;
- surface->pending_set_flags = 0;
- }
+ gdk_surface_queue_set_is_mapped (surface, FALSE);
if (was_mapped)
{
gdk_surface_set_state (GdkSurface *surface,
GdkToplevelState new_state)
{
- gboolean was_mapped, mapped;
gboolean was_sticky, sticky;
g_return_if_fail (GDK_IS_SURFACE (surface));
* inconsistent state to the user.
*/
- was_mapped = GDK_SURFACE_IS_MAPPED (surface);
was_sticky = GDK_SURFACE_IS_STICKY (surface);
surface->state = new_state;
- mapped = GDK_SURFACE_IS_MAPPED (surface);
sticky = GDK_SURFACE_IS_STICKY (surface);
if (GDK_IS_TOPLEVEL (surface))
g_object_notify (G_OBJECT (surface), "state");
- if (was_mapped != mapped)
- g_object_notify_by_pspec (G_OBJECT (surface), properties[PROP_MAPPED]);
-
if (was_sticky != sticky)
g_object_notify (G_OBJECT (surface), "sticky");
}
gdk_synthesize_surface_state (surface,
surface->pending_unset_flags,
surface->pending_set_flags);
- if (surface->pending_unset_flags & GDK_TOPLEVEL_STATE_WITHDRAWN)
- gdk_surface_invalidate_rect (surface, NULL);
surface->pending_unset_flags = 0;
surface->pending_set_flags = 0;
}
+static gboolean
+set_is_mapped_idle (gpointer user_data)
+{
+ GdkSurface *surface = GDK_SURFACE (user_data);
+
+ surface->set_is_mapped_source_id = 0;
+
+ g_return_val_if_fail (surface->pending_is_mapped != surface->is_mapped,
+ G_SOURCE_REMOVE);
+
+ surface->is_mapped = surface->pending_is_mapped;
+ if (surface->is_mapped)
+ gdk_surface_invalidate_rect (surface, NULL);
+
+ g_object_notify (G_OBJECT (surface), "mapped");
+
+ return G_SOURCE_REMOVE;
+}
+
+void
+gdk_surface_set_is_mapped (GdkSurface *surface,
+ gboolean is_mapped)
+{
+ gboolean was_mapped;
+
+ if (surface->pending_is_mapped != surface->is_mapped)
+ g_clear_handle_id (&surface->set_is_mapped_source_id, g_source_remove);
+
+ surface->pending_is_mapped = is_mapped;
+
+ was_mapped = surface->is_mapped;
+ surface->is_mapped = is_mapped;
+ if (surface->is_mapped)
+ gdk_surface_invalidate_rect (surface, NULL);
+
+ if (was_mapped != is_mapped)
+ g_object_notify (G_OBJECT (surface), "mapped");
+}
+
+static void
+gdk_surface_queue_set_is_mapped (GdkSurface *surface,
+ gboolean is_mapped)
+{
+ if (surface->pending_is_mapped == is_mapped)
+ return;
+
+ surface->pending_is_mapped = is_mapped;
+
+ if (surface->is_mapped == surface->pending_is_mapped)
+ {
+ g_clear_handle_id (&surface->set_is_mapped_source_id, g_source_remove);
+ }
+ else
+ {
+ g_return_if_fail (!surface->set_is_mapped_source_id);
+
+ surface->set_is_mapped_source_id =
+ g_idle_add_full (G_PRIORITY_HIGH - 10,
+ set_is_mapped_idle,
+ surface, NULL);
+ }
+}
+
static gboolean
check_autohide (GdkEvent *event)
{
GdkSurface *parent; /* for popups */
GList *children; /* popups */
+ guint set_is_mapped_source_id;
+ gboolean pending_is_mapped;
+ gboolean is_mapped;
+
gpointer widget;
int x;
#define GDK_SURFACE_DESTROYED(d) (((GdkSurface *)(d))->destroyed)
-#define GDK_SURFACE_IS_MAPPED(surface) (((surface)->state & GDK_TOPLEVEL_STATE_WITHDRAWN) == 0)
-
+#define GDK_SURFACE_IS_MAPPED(surface) ((surface)->pending_is_mapped)
void gdk_surface_set_state (GdkSurface *surface,
GdkToplevelState new_state);
+void gdk_surface_set_is_mapped (GdkSurface *surface,
+ gboolean is_mapped);
+
GdkMonitor * gdk_surface_get_layout_monitor (GdkSurface *surface,
GdkPopupLayout *layout,
void (*get_bounds) (GdkMonitor *monitor,
g_param_spec_flags ("state",
P_("State"),
P_("State"),
- GDK_TYPE_TOPLEVEL_STATE, GDK_TOPLEVEL_STATE_WITHDRAWN,
+ GDK_TYPE_TOPLEVEL_STATE, 0,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
g_object_interface_install_property (iface,
g_param_spec_string ("title",
/**
* GdkToplevelState:
- * @GDK_TOPLEVEL_STATE_WITHDRAWN: the surface is not shown
* @GDK_TOPLEVEL_STATE_MINIMIZED: the surface is minimized
* @GDK_TOPLEVEL_STATE_MAXIMIZED: the surface is maximized
* @GDK_TOPLEVEL_STATE_STICKY: the surface is sticky
*/
typedef enum
{
- GDK_TOPLEVEL_STATE_WITHDRAWN = 1 << 0,
- GDK_TOPLEVEL_STATE_MINIMIZED = 1 << 1,
- GDK_TOPLEVEL_STATE_MAXIMIZED = 1 << 2,
- GDK_TOPLEVEL_STATE_STICKY = 1 << 3,
- GDK_TOPLEVEL_STATE_FULLSCREEN = 1 << 4,
- GDK_TOPLEVEL_STATE_ABOVE = 1 << 5,
- GDK_TOPLEVEL_STATE_BELOW = 1 << 6,
- GDK_TOPLEVEL_STATE_FOCUSED = 1 << 7,
- GDK_TOPLEVEL_STATE_TILED = 1 << 8,
- GDK_TOPLEVEL_STATE_TOP_TILED = 1 << 9,
- GDK_TOPLEVEL_STATE_TOP_RESIZABLE = 1 << 10,
- GDK_TOPLEVEL_STATE_RIGHT_TILED = 1 << 11,
- GDK_TOPLEVEL_STATE_RIGHT_RESIZABLE = 1 << 12,
- GDK_TOPLEVEL_STATE_BOTTOM_TILED = 1 << 13,
- GDK_TOPLEVEL_STATE_BOTTOM_RESIZABLE = 1 << 14,
- GDK_TOPLEVEL_STATE_LEFT_TILED = 1 << 15,
- GDK_TOPLEVEL_STATE_LEFT_RESIZABLE = 1 << 16
+ GDK_TOPLEVEL_STATE_MINIMIZED = 1 << 0,
+ GDK_TOPLEVEL_STATE_MAXIMIZED = 1 << 1,
+ GDK_TOPLEVEL_STATE_STICKY = 1 << 2,
+ GDK_TOPLEVEL_STATE_FULLSCREEN = 1 << 3,
+ GDK_TOPLEVEL_STATE_ABOVE = 1 << 4,
+ GDK_TOPLEVEL_STATE_BELOW = 1 << 5,
+ GDK_TOPLEVEL_STATE_FOCUSED = 1 << 6,
+ GDK_TOPLEVEL_STATE_TILED = 1 << 7,
+ GDK_TOPLEVEL_STATE_TOP_TILED = 1 << 8,
+ GDK_TOPLEVEL_STATE_TOP_RESIZABLE = 1 << 9,
+ GDK_TOPLEVEL_STATE_RIGHT_TILED = 1 << 10,
+ GDK_TOPLEVEL_STATE_RIGHT_RESIZABLE = 1 << 11,
+ GDK_TOPLEVEL_STATE_BOTTOM_TILED = 1 << 12,
+ GDK_TOPLEVEL_STATE_BOTTOM_RESIZABLE = 1 << 13,
+ GDK_TOPLEVEL_STATE_LEFT_TILED = 1 << 14,
+ GDK_TOPLEVEL_STATE_LEFT_RESIZABLE = 1 << 15
} GdkToplevelState;
was_mapped = GDK_SURFACE_IS_MAPPED (GDK_SURFACE (self));
if (!was_mapped)
- gdk_synthesize_surface_state (GDK_SURFACE (self), GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (GDK_SURFACE (self), TRUE);
_gdk_macos_display_clear_sorting (GDK_MACOS_DISPLAY (GDK_SURFACE (self)->display));
return;
if (!GDK_SURFACE_IS_MAPPED (surface))
- gdk_surface_queue_state_change (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
}
static void
set_bits = 0;
unset_bits = 0;
- if (IsWindowVisible (msg->hwnd))
- unset_bits |= GDK_TOPLEVEL_STATE_WITHDRAWN;
- else
- set_bits |= GDK_TOPLEVEL_STATE_WITHDRAWN;
-
if (IsIconic (msg->hwnd))
set_bits |= GDK_TOPLEVEL_STATE_MINIMIZED;
else
else
unset_bits |= GDK_TOPLEVEL_STATE_MAXIMIZED;
+ gdk_surface_set_is_mapped (window, !!IsWindowVisible (msg->hwnd));
gdk_synthesize_surface_state (window, unset_bits, set_bits);
new_state = window->state;
if (state & GDK_TOPLEVEL_STATE_ ## x) \
(bufp += sprintf (bufp, "%s" #x, s), s = "|")
- /* For clarity, also show the complement of WITHDRAWN, i.e. "MAPPED" */
- if (!(state & GDK_TOPLEVEL_STATE_WITHDRAWN))
- (bufp += sprintf (bufp, "MAPPED"), s = "|");
-
- BIT (WITHDRAWN);
BIT (MINIMIZED);
BIT (MAXIMIZED);
BIT (STICKY);
_gdk_win32_surface_state_to_string (window->state)));
if (GDK_SURFACE_IS_MAPPED (window))
- gdk_synthesize_surface_state (window,
- 0,
- GDK_TOPLEVEL_STATE_WITHDRAWN);
+ gdk_surface_set_is_mapped (window, FALSE);
_gdk_surface_clear_update_area (window);
show_popup (GdkSurface *surface)
{
gdk_win32_surface_raise (surface);
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
show_window_internal (surface, FALSE, FALSE);
gdk_surface_invalidate_rect (surface, NULL);
}
was_mapped = GDK_SURFACE_IS_MAPPED (surface);
if (!was_mapped)
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
gdk_win32_surface_show (surface, FALSE);
* messing around with shifts, just make the passed value and GDK's
* enum values match by shifting to the first tiled state.
*/
- toplevel->edge_constraints = constraints[0] << 9;
+ toplevel->edge_constraints = constraints[0] << 8;
XFree (constraints);
}
if (gdk_x11_surface_get_group (surface))
gdk_x11_surface_set_group (x11_drag->ipc_surface, surface);
- gdk_synthesize_surface_state (x11_drag->ipc_surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (x11_drag->ipc_surface, TRUE);
gdk_x11_surface_show (x11_drag->ipc_surface, FALSE);
x11_drag->drag_surface = create_drag_surface (display);
{
GdkSurface *surface = gdk_gl_context_get_surface (context);
- if ((surface->state & GDK_TOPLEVEL_STATE_WITHDRAWN) == 0)
+ if (GDK_SURFACE_IS_MAPPED (surface))
return;
/* If we're about to withdraw the surface, then we don't care if the frame is
if (!force &&
!toplevel->is_leader &&
- surface->state & GDK_TOPLEVEL_STATE_WITHDRAWN)
+ !GDK_SURFACE_IS_MAPPED (surface))
return;
wm_hints.flags = StateHint | InputHint;
if (!surface->destroyed)
{
if (GDK_SURFACE_IS_MAPPED (surface))
- gdk_synthesize_surface_state (surface,
- 0,
- GDK_TOPLEVEL_STATE_WITHDRAWN);
+ gdk_surface_set_is_mapped (surface, FALSE);
g_assert (!GDK_SURFACE_IS_MAPPED (surface));
XWithdrawWindow (GDK_SURFACE_XDISPLAY (surface),
show_popup (GdkSurface *surface)
{
gdk_x11_surface_raise (surface);
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
gdk_x11_surface_show (surface, FALSE);
gdk_surface_invalidate_rect (surface, NULL);
}
gdk_surface_request_layout (surface);
if (!was_mapped)
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
gdk_x11_surface_show (surface, was_mapped);
GdkSurface *surface = GDK_SURFACE (drag_surface);
gdk_x11_surface_toplevel_resize (surface, width, height);
- gdk_synthesize_surface_state (surface, GDK_TOPLEVEL_STATE_WITHDRAWN, 0);
+ gdk_surface_set_is_mapped (surface, TRUE);
gdk_x11_surface_show (surface, FALSE);
gdk_surface_invalidate_rect (surface, NULL);
GdkSurface *surface;
GskRenderer *renderer;
- GdkToplevelState state;
GtkWidget *relative_to;
GdkRectangle rect;
GdkGravity rect_anchor;
}
static void
-surface_state_changed (GtkWidget *widget)
+mapped_changed (GdkSurface *surface,
+ GParamSpec *pspec,
+ GtkWidget *widget)
{
- GtkTooltipWindow *window = GTK_TOOLTIP_WINDOW (widget);
- GdkToplevelState new_surface_state;
- GdkToplevelState changed_mask;
-
- new_surface_state = gdk_toplevel_get_state (GDK_TOPLEVEL (window->surface));
- changed_mask = new_surface_state ^ window->state;
- window->state = new_surface_state;
-
- if (changed_mask & GDK_TOPLEVEL_STATE_WITHDRAWN)
- {
- if (window->state & GDK_TOPLEVEL_STATE_WITHDRAWN)
- gtk_widget_hide (widget);
- }
+ if (!gdk_surface_get_mapped (surface))
+ gtk_widget_hide (widget);
}
static gboolean
gdk_surface_set_widget (window->surface, widget);
- g_signal_connect_swapped (window->surface, "notify::state", G_CALLBACK (surface_state_changed), widget);
+ g_signal_connect (window->surface, "notify::mapped", G_CALLBACK (mapped_changed), widget);
g_signal_connect (window->surface, "render", G_CALLBACK (surface_render), widget);
g_signal_connect (window->surface, "event", G_CALLBACK (surface_event), widget);
gsk_renderer_unrealize (window->renderer);
g_clear_object (&window->renderer);
- g_signal_handlers_disconnect_by_func (window->surface, surface_state_changed, widget);
+ g_signal_handlers_disconnect_by_func (window->surface, mapped_changed, widget);
g_signal_handlers_disconnect_by_func (window->surface, surface_render, widget);
g_signal_handlers_disconnect_by_func (window->surface, surface_event, widget);
gdk_surface_set_widget (window->surface, NULL);
priv->decorated = TRUE;
priv->display = gdk_display_get_default ();
- priv->state = GDK_TOPLEVEL_STATE_WITHDRAWN;
+ priv->state = 0;
priv->deletable = TRUE;
priv->startup_id = NULL;
priv->renderer = gsk_renderer_new_for_surface (surface);
g_signal_connect_swapped (surface, "notify::state", G_CALLBACK (surface_state_changed), widget);
+ g_signal_connect_swapped (surface, "notify::mapped", G_CALLBACK (surface_state_changed), widget);
g_signal_connect (surface, "render", G_CALLBACK (surface_render), widget);
g_signal_connect (surface, "event", G_CALLBACK (surface_event), widget);
g_signal_connect (surface, "compute-size", G_CALLBACK (toplevel_compute_size), widget);
new_state = gdk_toplevel_get_state (GDK_TOPLEVEL (window));
msg = g_strconcat ((const char *)g_object_get_data (G_OBJECT (label), "title"), ": ",
- (new_state & GDK_TOPLEVEL_STATE_WITHDRAWN) ?
- "withdrawn" : "not withdrawn", ", ",
(new_state & GDK_TOPLEVEL_STATE_MINIMIZED) ?
"minimized" : "not minimized", ", ",
(new_state & GDK_TOPLEVEL_STATE_STICKY) ?